#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import io
import os
import shutil
import argparse

import py7zr

config_text = """;!@Install@!UTF-8!
Title="MyApp Installer"
RunProgram="powershell.exe -ExecutionPolicy Bypass -File run.ps1"
;!@InstallEnd@!
"""


def parse_args():
    parser = argparse.ArgumentParser(description="使用 Python 构建 7z 自解压安装包（SFX）")
    parser.add_argument("source_dir", help="要压缩的目录")
    parser.add_argument("--output", "-o", help="输出的自解压 exe 文件名（默认：以目录名命名）")
    parser.add_argument("--run", default="powershell.exe -ExecutionPolicy Bypass -File run.ps1",
                        help="解压后自动运行的命令（默认运行 run.ps1）")
    parser.add_argument("--sfx", default=r"C:\Program Files\7-Zip\7z.sfx", help="SFX 模块路径（默认：当前目录下的 7z.sfx）")
    
    args = parser.parse_args()
    
    # 自动推导输出文件名（如果未指定）
    if not args.output:
        dir_name = os.path.basename(os.path.abspath(args.source_dir))
        args.output = f"{dir_name}.exe"
    elif not args.output.lower().endswith(".exe"):
        args.output += ".exe"
    
    if not os.path.isdir(args.source_dir):
        print(f"❌ 错误：目录不存在: {args.source_dir}")
        exit(1)
    
    if not os.path.isfile(args.sfx):
        print(f"❌ 错误：SFX 模块不存在: {args.sfx}")
        exit(1)
    return args


if __name__ == '__main__':
    args = parse_args()
    
    payload_archive = io.BytesIO()
    with py7zr.SevenZipFile(payload_archive, 'w') as archive:
        archive.writeall('.idea', arcname='')
    
    # 移动到开头以便读取
    payload_archive.seek(0)  # 一定要加这句!!不然会报错!!!
    
    with open(args.sfx, 'rb') as sfx_file, open(args.output, 'wb') as f_out:
        shutil.copyfileobj(sfx_file, f_out)
        f_out.write(config_text.encode('utf-8'))
        shutil.copyfileobj(payload_archive, f_out)
    
    print(f"✅ 自解压安装包已生成: {args.output}")
